package part3collection;

import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import java.util.concurrent.CopyOnWriteArrayList;

/**
 * ArrayList
 * Vector
 * CopyOnWriteArrayList
 * <p>
 * HashSet
 * CopyOnWriteArraySet
 * <p>
 * HashMap
 * ConcurrentHashMap
 */
public class ListTest01 {

    // 会报错，ArrayList有并发问题
    public static void main01(String[] args) {
        List<String> list = new ArrayList<>();

        for (int i = 0; i < 30; i++) {
            new Thread(() -> {
                list.add(UUID.randomUUID().toString().substring(0, 8));
                System.out.println(list);
            }, String.valueOf(i)).start();
        }
    }

    /**
     * CopyOnWriteArrayList不存在并发问题
     * <p>
     * 核心思想：如果有多个调用者（Callers）同时要求相同的资源（如内存或者是磁盘上的数据存储），他们会共
     * 同获取相同的指针指向相同的资源，直到某个调用者视图修改资源内容时，系统才会真正复制一份专用
     * 副本（private copy）给该调用者，而其他调用者所见到的最初的资源仍然保持不变。这过程对其他的
     * 调用者都是透明的（transparently）。此做法主要的优点是如果调用者没有修改资源，就不会有副本
     * （private copy）被创建，因此多个调用者只是读取操作时可以共享同一份资源。
     * <p>
     * 为什么比Vector性能好：Vector是增删改查方法都加了synchronized，保证同步，但是每个方法执行的时候都要去获得
     * 锁，性能就会大大下降，而CopyOnWriteArrayList 只是在增删改上加锁，但是读不加锁，在读方面的性
     * 能就好于Vector，CopyOnWriteArrayList支持读多写少的并发情况。
     */
    public static void main02(String[] args) {
        List<String> list = new CopyOnWriteArrayList<>();

        for (int i = 0; i < 30; i++) {
            new Thread(() -> {
                list.add(UUID.randomUUID().toString().substring(0, 8));
                System.out.println(list);
            }, String.valueOf(i)).start();
        }
    }


}
